﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Entidades;
using Excepciones;
using Negocio;
using DAO;

namespace LisBioGUIWPF.Controls.Alumno
{
    /// <summary>
    /// Lógica de interacción para EncuestaData.xaml
    /// </summary>
    public partial class AlumnoData : UserControl
    {
        private LisBio lisBio;

        public enum Operacion
        { 
            NUEVO, MODIFICAR, ELIMINAR, DETALLES
        }

        private Operacion operacion;
        private ReglaBase.Operacion operRegla;
        private AlumnoControl control;
        private EntidadAlumno alumno;

        public AlumnoData(LisBio lisBio, Operacion operacion, AlumnoControl control)
        {
            InitializeComponent();
            this.lisBio = lisBio;
            this.operacion = operacion;
            this.control = control;
            
            switch (operacion)
            {
                case Operacion.NUEVO:
                    this.operRegla = ReglaBase.Operacion.INSERT; break;
                case Operacion.MODIFICAR:
                    this.tabAlumno.Header = "Modificar Alumno";
                    this.tabEncuesta.Visibility = Visibility.Hidden;
                    this.operRegla = ReglaBase.Operacion.UPDATE; break;
                case Operacion.ELIMINAR:
                    this.tabAlumno.Header = "Eliminar Alumno";
                    this.tabEncuesta.Visibility = Visibility.Hidden;
                    this.btnGuardar.Content = "Eliminar";
                    this.bloquear();
                    this.operRegla = ReglaBase.Operacion.DELETE; break;
                case Operacion.DETALLES:
                    this.btnGuardar.Content = "Cerrar";
                    this.btnCancel.Visibility = Visibility.Hidden;
                    this.bloquear(); break;
            }

            this.comboCarrera.Items.Add("Sistemas");
            this.comboCarrera.Items.Add("Quimica");
            this.comboCarrera.Items.Add("Industrial");
            this.comboCarrera.Items.Add("Electronica");
            this.comboCarrera.Items.Add("Civil");

            this.Loaded += new RoutedEventHandler(AlumnoData_Loaded);
        }

        void AlumnoData_Loaded(object sender, RoutedEventArgs e)
        {
            this.txtNombre.Focus();
        }

        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            ImageControl image = new ImageControl(this.lisBio);
            image.setDefaultImage();
            this.lisBio.borderHuella.Child = image;
            this.control.listarAlumnos();
            this.control.IsEnabled = true;
        }

        private bool checkData()
        {
            if (txtNombre.Text.Length > 0 && txtMail.Text.Length > 0)
            {
                return true;
            }

            return false;
        }

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            if (!this.checkData())
            {
                MessageBox.Show("Faltan completar algunos Datos.", "Datos Incorrectos");
            }
            else
            {
                EntidadAlumno alumnoEntidad = new EntidadAlumno(txtNombre.Text, txtLegajo.Text,
                    ((string)comboCarrera.SelectedItem), txtMail.Text);

                if (alumno != null)
                {
                    alumnoEntidad.Id = alumno.Id;
                }

                AlumnoDAO alumnoDAO = new AlumnoDAO();
                ReglaBase regla = new ReglaBase(alumnoEntidad, alumnoDAO, this.operRegla);

                try
                {
                    int id = regla.execute();
                    if (id != 0) alumnoEntidad.Id = id;

                    if (this.checkEncuesta())
                    {
                        EntidadEncuesta encuesta = new EntidadEncuesta(((bool)this.checkConociasLab.IsChecked),
                            ((bool)this.checkCualquierAlumno.IsChecked), ((bool)this.checkCharlas.IsChecked),
                            ((bool)this.checkInteresaria.IsChecked), ((bool)this.checkRecibirInfo.IsChecked),
                            ((bool)this.checkBases.IsChecked), ((bool)this.checkLenguajes.IsChecked),
                            ((bool)this.checkCompiladores.IsChecked), ((bool)this.checkData2.IsChecked),
                            ((bool)this.checkWeb.IsChecked), ((bool)this.checkInteligencia.IsChecked),
                            ((bool)this.checkConcurrente.IsChecked), ((bool)this.checkImagenes.IsChecked),
                            ((bool)this.checkMoviles.IsChecked), ((bool)this.checkEncriptacion.IsChecked),
                            ((bool)this.checkRobotica.IsChecked), ((bool)this.checkInter.IsChecked),
                            ((bool)this.checkHigh.IsChecked), alumnoEntidad.Id);

                        EncuestaDAO encuestaDao = new EncuestaDAO();
                        ReglaBase reglaEncuesta = new ReglaBase(encuesta, encuestaDao, ReglaBase.Operacion.INSERT);
                        reglaEncuesta.execute();
                    }

                    switch (operacion)
                    {
                        case Operacion.NUEVO:
                            this.lisBio.notification("Alumno Guardado");
                            break;
                        case Operacion.MODIFICAR:
                            this.lisBio.notification("Alumno Modificado");
                            break;
                        case Operacion.ELIMINAR:
                            this.lisBio.notification("Alumno Eliminado");
                            break;
                    }

                    this.btnCancel_Click(sender, e);
                }
                catch (InvalidEntityException exc)
                {
                    MessageBox.Show("Los Datos del Alumno no se han podido guardar.\n" +
                    "Por favor intentelo nuevamente...", "Datos Alumno");
                }
                catch (Exception exception)
                {
                    MessageBox.Show("Se ha producido el siguiente error:\n"+exception.Message, "Error!");

                    MessageBoxResult result = MessageBox.Show("Desea reportar el error?", "Error Desconocido", MessageBoxButton.YesNo);

                    if (result == MessageBoxResult.Yes)
                    {
                        ReportBugs reportar = new ReportBugs();
                        reportar.Show();
                    }
                }

                
            }
        }

        private bool checkEncuesta()
        {
            bool value = ((bool)checkBases.IsChecked) || ((bool)checkCharlas.IsChecked) ||
                ((bool)checkCompiladores.IsChecked) || ((bool)checkConcurrente.IsChecked) ||
                ((bool)checkConociasLab.IsChecked) || ((bool)checkCualquierAlumno.IsChecked) ||
                ((bool)checkData2.IsChecked) || ((bool)checkEncriptacion.IsChecked) ||
                ((bool)checkHigh.IsChecked) || ((bool)checkImagenes.IsChecked) ||
                ((bool)checkInteligencia.IsChecked) || ((bool)checkInter.IsChecked) ||
                ((bool)checkInteresaria.IsChecked) || ((bool)checkLenguajes.IsChecked) ||
                ((bool)checkMoviles.IsChecked) || ((bool)checkRecibirInfo.IsChecked) ||
                ((bool)checkRobotica.IsChecked) || ((bool)checkWeb.IsChecked);

            return value;
        }

        private void bloquear()
        {
            this.txtNombre.IsReadOnly = true;
            this.txtLegajo.IsReadOnly = true;
            this.txtMail.IsReadOnly = true;
            this.comboCarrera.IsEnabled = false;
        }

        public EntidadAlumno Alumno
        {
            get { return this.alumno; }
            set { this.alumno = value; }
        }

        public void cargarDatos()
        {
            txtNombre.Text = alumno.Nombre;
            txtLegajo.Text = alumno.Legajo;
            txtMail.Text = alumno.Mail;
            comboCarrera.SelectedItem = alumno.Carrera;
        }
    }
}
